ex-opt 之前的故事
正如上文所述,对于流溪河模型,我们需要使用 PSO(粒子群优化)等算法进行参数优选。优化速度越快,意味着我们能在相同时间内搜索越广阔的参数空间,计算网格相应的也可以设定的更精细。因此,对参数优选引擎进行持续的性能优化至关重要。
课题组以往的程序均使用 Java 编写,且都在单机上运行,未考虑集群并行。听闻很早之前为了在超算中心上运行流溪河模型,专门邀请过计算机系的团队重写过一版能分布式运行的模型(推测是基于 MPI 实现的分布式),但由于难以维护,很快就被放弃使用。因此,分布式系统的参数优选问题迟迟没有得到解决。
为进一步提高整体的计算效率,笔者于 2026 年初将整个计算流程使用 C++ 重写。主要原因在于:C++ 更适合重计算的编程场景,其实是本人更喜欢 C++ 语言。之后的时间里,笔者一直在思考如何优雅地实现分布式的参数优选。个人认为,这个优选系统应当具备以下特点:
- 易用与非侵入式设计:即使是没有多线程并发、分布式系统开发经验的开发者也能快速上手使用。
- 框架轻量化:尽可能适配不同的业务场景,且易于调试与排错。
ex-actor
ex-actor 是一个基于 C++26 P2300 std::execution(当前基于其 C++20 早期实现 stdexec)的现代 C++ Actor 模式框架。只需一行代码,就可以将一个普通的 C++ 类转换为一个有状态的异步服务。
经过深入调研,ex-actor 完美契合了我们对分布式框架的需求。经过一个月的架构设计与编码实现,ex-opt 应运而生 —— 这是一个通用的 C++ 分布式超参数优选框架。
什么是 ex-opt
ex-opt 是一个用现代 C++20 编写的高性能、异步和分布式黑盒优化框架。
核心设计与技术栈
- 执行模型 (stdexec):采用 Sender/Receiver 结构化并发模型,提供极低开销的无锁任务调度和线程池管理。
- 分布式 Actor 框架 (ex-actor):评估任务被封装为分布式 Actor。无论是本地多线程评估还是跨机器的分布式集群评估,共享完全相同的代码和编程接口。
- ZeroMQ 通信:使用
EX_OPT_REGISTER_DISTRIBUTED宏即可自动为自定义目标函数生成 RPC 接口,实现集群内节点间的高效通信。
核心特性
- 统一的优化接口:提供
ex_opt::optimize统一同步接口,无论本地运行还是分布式集群运行,用户都无需关心底层的异步调度与通信逻辑。 - 流水线调度模式:
- Batch 模式:适用于 GA、PSO 等群体算法,支持整代参数的并行评估。
- Stream 模式:适用于 SA 等顺序搜索算法,空闲 Worker 随完随补,避免个别 Worker 因计算长尾导致整体停滞。
- 算法与执行解耦:算法决策策略(
Policy)和模拟计算器(WorkerActor)之间完全解耦。
正在做的事
利用 ex-opt 轻量化的集群部署方案在团队自建集群服务器上部署更高性能稳定的模型,支撑团队未来建模及应用。
不断完善 ex-opt 包括(Python Bindings、提供更多流式优化算法的实现、集群容错等),为分布式的参数优选任务场景提供更易用、稳定的开源方案 :)